package com.tcc.util.file;

import org.apache.pdfbox.io.IOUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 文件工具类
 *
 * @author tcc
 */
public class FileUtil {

    /**
     * 1.获取用户当前所在的目录的路径
     *
     * @return
     */
    public static String getUserDir() {
        String property = System.getProperty("user.dir");
        return property;
    }

    /**
     * 2.获取操作系统目录的路径
     *
     * @return
     */
    public static String getUserHomeDir() {
        return System.getProperty("user.home");
    }

    /**
     * 3.获取操作系统临时目录
     *
     * @return
     */
    public static String getTmpDir() {
        return System.getProperty("java.io.tmpdir");
    }

    /**
     * 判断 当前系统 是linux 还是 Windows
     *
     * @return
     */
    public static String getCurrentSystem(String winPath, String linuxPath) {

        String fontPath = System.getProperty("os.name").toLowerCase().contains("windows") ? winPath : linuxPath;
        return fontPath;
    }


    /**
     * 4.获取一个文件的根路径
     *
     * @param file
     * @return
     */
    public static File getRoot(File file) {

        // 获取文件名称
        String name = file.getPath();

        // 数据处理
        String substring = name.substring(0, name.lastIndexOf(":") + 1);

        return new File(substring);
    }

    /**
     * 5-1 获取文件的扩展名
     *
     * @param name
     * @return
     */
    public static String getFileExtensions(String name) {

        // 获取文件路径
        int i = name.lastIndexOf(".");
        if (i < 0) {
            return "文件上传不正确";
        }
        return name.substring(name.lastIndexOf("."));
    }

    /**
     * 5-2 获取文件的扩展名
     *
     * @param file
     * @return
     */
    public static String getFileExtensions(File file) {
        // 获取文件名称
        String name = file.getName();
        return getFileExtensions(name);
    }

    /**
     * 6.获取对应单位大小的文件
     *
     * @param file
     * @param unit
     * @return
     */
    public static String getFileSize(File file, FileSizeUnit unit) {

        long length = file.length();

        long ram = length / unit.getCode();

        return ram + unit.getName();
    }

    /**
     * 7.获取所在磁盘的总空间
     *
     * @param file
     * @param unit
     * @return
     */
    public static String getTotalSpace(File file, FileSizeUnit unit) {

        // 获取文件所在磁盘
        File f = getRoot(file);

        long totalSpace = f.getTotalSpace();

        return totalSpace / unit.getCode() + unit.getName();

    }

    /**
     * 8.获取磁盘的剩余空间
     *
     * @param file
     * @param unit
     * @return
     */
    public static String getFreeSpace(File file, FileSizeUnit unit) {

        // 获取文件所在磁盘
        File f = getRoot(file);

        long freeSpace = f.getFreeSpace();

        return freeSpace / unit.getCode() + unit.getName();

    }

    /**
     * 9.递归删除文件
     *
     * @param file
     */
    public static void deletes(File file) {

        File[] files = file.listFiles();
        if (files != null && files.length > 0) {

            for (File f : files) {

                if (f.isFile()) { // 判断是否为具体某个文件
                    f.delete();
                } else {
                    deletes(f);
                }
            }
        }
        // 删除空文件
        file.delete();
    }


    /**
     * 下载预览文件
     *
     * @param response
     * @param source       源文件
     * @param downloadName 下载的文件名
     * @param mode         模式  下载:0  预览:1
     * @throws IOException
     */
    public static void download(HttpServletResponse response, String source, String downloadName, int mode) throws IOException {
        String modeStr = "inline";
        if (mode == 0) {
            modeStr = "attachment";
            downloadName = new String(downloadName.getBytes("utf-8"), "iso-8859-1");
        }
        //设置请求头
        response.setHeader("Content-Disposition", modeStr + ";fileName=" + downloadName);
        InputStream iStream = new FileInputStream(source);
        IOUtils.copy(iStream, response.getOutputStream());
        iStream.close();
    }


}
